package gui;

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 * Fenêtres de dialogue 
 * 
 * @author			Christos Kornaros, Grégory Moinat, Nicolas Muller
 * @version			1.0, 02.04.2008
 * Fichier :		JFileDialogBox.java
 * Remarque(s) :	-
 * Compilateur : 	jdk1.6.0_02
*/
public class JFileDialogBox {
	
	/** 
	 * Classe dérivée de FileFilter qui permet de récupérer l'extension d'un fichier
	 */	
    public static class FileExtensionFilter extends javax.swing.filechooser.FileFilter {
    	
        String description; // description du type de fichier (ex: Fichiers C (.c))
        String extension;	// extension d'un type de fichier (ex pour un fichier C: c)
        
    	/** 
    	 * Constructeur pour un filtre d'extension pour les fichiers
    	 * 
    	 * @param description Description du type de fichier (ex: Fichiers C (.c))
    	 * @param extension Extension d'un type de fichier (ex pour un fichier C: c)
    	 */
        public FileExtensionFilter(String description, String extension){
            this.description = description;
            this.extension = extension;
        }

    	/** 
    	 * Retourne si le fichier est accepté par le filtre
    	 * 
    	 * @param file Le fichier à accepter
    	 * @return True si le fichier est accepté, false sinon
    	 */
        public boolean accept(java.io.File file) {
            return file.getName().endsWith("." + extension) || file.isDirectory();
        }
        
    	/** 
    	 * Sélecteur pour la description du type de fichier
    	 * 
    	 * @return La description du type de fichier
    	 */        
        public String getDescription() {
            return description;
        }
        
    	/** 
    	 * Sélecteur de l'extention d'un fichier
    	 * 
    	 * @return L'extension d'un type de fichier
    	 */        
        public String getExtension() {
            return extension;
        }
    } 

	/** 
	 * Fenêtre de dialogue pour la sauvegarde d'un fichier
	 * 
	 * @param parent La fenêtre parent (modal)
	 * @return Le chemin complet où sauvegarder le fichier ou null si l'utilisateur a appuyé sur Annuler
	 */ 
	public static String FileSaveBox(JColoredTextZone parent) {
		
		final String WIN_TITLE = "Sauvegarder Fichier";
		final String MSG_TITLE = "Confirmer l'enregistrement";
		final String MSG_TEXT_START = "le fichier ";
		final String MSG_TEXT_END = " existe déjà.\n Voulez-vous le remplacer ?";
		
		// Pour la sauvegarde de fichier
		JFileChooser flcSave = new JFileChooser();
		String path = "";
		
		// Variables pour la vérification du fichier à sauver (ex: si le fichier existe déjà)
		File verificationFichier;
		boolean sauvegarderOk = false; 
		Object[] option = {"Oui", "Non"}; // Choix disponibles pour l'utilisateur

        // Fichiers supportés par l'application
		flcSave.addChoosableFileFilter(new FileExtensionFilter("Fichiers H (.h)", "h"));
		flcSave.addChoosableFileFilter(new FileExtensionFilter("Fichiers C (.c)", "c"));
		flcSave.addChoosableFileFilter(new FileExtensionFilter("Fichiers H++ (.hpp)", "hpp"));
		flcSave.addChoosableFileFilter(new FileExtensionFilter("Fichiers C++ (.cpp)", "cpp")); 
    
		// Ouverture de la boîte de dialogue
		flcSave.setDialogTitle(WIN_TITLE);
		do {
			if(flcSave.showSaveDialog(parent) == JFileChooser.APPROVE_OPTION){
			
		        if (flcSave.getFileFilter().getClass() == FileExtensionFilter.class) {
		            // L'extension est déjà dans le nom du fichier
		            if (flcSave.getName(flcSave.getSelectedFile()).endsWith("." + ((FileExtensionFilter)flcSave.getFileFilter()).getExtension())) {
		            	path = flcSave.getCurrentDirectory().toString() + "/" + flcSave.getSelectedFile().getName();
		            }
		            else {
		            	path = flcSave.getCurrentDirectory().toString() + "/" + flcSave.getSelectedFile().getName() + 
		            			 "." + ((FileExtensionFilter)flcSave.getFileFilter()).getExtension();
		            }
		        }
		        // L'extension choisie est "Tous les fichiers"
		        else {
		        	path = flcSave.getCurrentDirectory().toString() + "/" + flcSave.getSelectedFile().getName();
		        }
		        
		        // On vérifie qu'un fichier du même nom n'existe pas déjà
		        verificationFichier = new File(path);
		        if (verificationFichier.exists()) {
		        	// Si un fichier de même nom existe, alors on demande si on doit écraser le fichier
		        	if (JOptionPane.showOptionDialog(flcSave, MSG_TEXT_START + new File(path).getName() + MSG_TEXT_END, MSG_TITLE, JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, option, option[1]) == JOptionPane.YES_OPTION){
		        		sauvegarderOk = true;
		        	}
		        }
		        else {
		        	sauvegarderOk = true;
		        }
			}
			else {
				return null;
			}
		} while (!sauvegarderOk);
		return path;
	}

	/** 
	 * Fenêtre de dialogue pour l'ouverture d'un fichier
	 * 
	 * @param parent La fenêtre parent (modal)
	 * @return Le chemin complet du fichier à charger ou null si l'utilisateur a appuyé sur Annuler
	 */ 
	public static String FileOpenBox(JColoredTextZone parent) {
		
		final String TITLE = "Ouvrir Fichier";
		// Pour le chargement de ficher
		JFileChooser flcOpen = new JFileChooser();
		
		// Filtres à appliquer
	    flcOpen.addChoosableFileFilter(new FileNameExtensionFilter("Fichiers C", "c", "h"));
	    flcOpen.addChoosableFileFilter(new FileNameExtensionFilter("Fichiers C++", "cpp", "h", "hpp"));
	    flcOpen.addChoosableFileFilter(new FileNameExtensionFilter("Fichiers C C++", "cpp", "c", "h"));
	    
	    // Ouverture de la boîte de dialogue
	    flcOpen.setDialogTitle(TITLE);
	    if(flcOpen.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {
	        return flcOpen.getSelectedFile().getPath();
	    }
	    else {
	    	return null;
	    }
	}

	/** 
	 * Fenêtre de dialogue pour la demande de confirmation des modifications apporté à un fichier
	 * 
	 * @param parent La fenêtre parent (modal)
	 * @param path Le chemin du fichier
	 * @return Le choix effectué par l'utilisateur (Enregistrer, Ne Pas Enregistrer, Annuler)
	 */ 
	public static String FileConfirmationBox(JColoredTextZone parent, String path) {
		
		final String MSG_TEXT = "Voulez-vous enregistrer les modification apporté au fichier " + (new File(path).getName()) + "?"; 
		final String MSG_TITLE = "C.O.D.E.";
		
		Object[] option = {"Enregistrer", "Ne Pas Enregistrer", "Annuler"};
		int choice = 1;
		
		choice = JOptionPane.showOptionDialog(parent, MSG_TEXT, MSG_TITLE , JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, option, option[0]);
		
		// Permet de gérer la touche 'Esc' (cette touche retourne -1) comme option Annuler
		if (choice < 0) {
			choice = 2;
		}
		return option[choice].toString();
	}
}
